package br.com.quiz.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import br.com.quiz.domain.Disciplina;
import br.com.quiz.domain.DisciplinaProfessor;
import br.com.quiz.domain.Professor;
import br.com.quiz.domain.UnidadeDeEnsinoDisciplina;
import br.com.quiz.domain.UnidadedeEnsino;
import br.com.quiz.factory.ConexaoFactory;
import br.com.quiz.util.HibernateUtil;

public class UnidadeDeEnsinoDisciplinaDAO {

	public static List<UnidadeDeEnsinoDisciplina> listar() {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		List<UnidadeDeEnsinoDisciplina> listaDisciplinaUnidade = null;
		try {
			Query consulta = sessao
					.getNamedQuery("UnidadeDeEnsinoDisciplina.listar");
			listaDisciplinaUnidade = consulta.list();
		} catch (RuntimeException e) {
			throw e;
		} finally {
			sessao.close();
		}

		return listaDisciplinaUnidade;

	}

	public static List<UnidadeDeEnsinoDisciplina> filtrarIdUnidade(
			UnidadedeEnsino u) {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		List disciplinas;
		try {
			StringBuffer hql = new StringBuffer();
			hql.append("SELECT d FROM UnidadeDeEnsinoDisciplina d ");
			// hql.append("where d.professor := " );
			// hql.append("where d.professor = " + p.getProId());

			Query query = sessao.createQuery(hql.toString());
			disciplinas = query.list();

			return disciplinas;

		} catch (RuntimeException ex) {
			sessao.cancelQuery();
		} finally {
			sessao.close();
		}
		return null;
	}

	public static ArrayList<Disciplina> listarDisciplinasPorUnidade(
			UnidadedeEnsino u) {
		Connection con;
		PreparedStatement ps;

		try {
			con = ConexaoFactory.conectar();
			ArrayList<Disciplina> disciplinas = new ArrayList();
			String sql = "select d.DIS_ID, d.DIS_DESCRICAO "
					+ "from disciplina d inner join unidade_de_ensino_disciplina disUni "
					+ "on disUni.UND_DIS_ID=d.DIS_ID "
					+ "inner join unidade_de_ensino u on u.UDE_ID=disUni.UND_UDE_ID "
					+ "where u.UDE_ID = ? ";
			ps = con.prepareStatement(sql);
			ps.setInt(1, u.getUdeId());
			System.out.println(ps);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				Disciplina d = new Disciplina();
				d.setDisId(rs.getInt("DIS_ID"));
				d.setDisDescricao(rs.getString("DIS_DESCRICAO"));
				disciplinas.add(d);
				System.out.println(d);
			}
			System.out.println("Listagem de disciplinas obtidas com sucesso!");
			return disciplinas;
		} catch (Exception e) {
			System.out.println("Falha ao listar disciplinas " + e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	public static void incluirDisciplinaUnidade(UnidadedeEnsino u, Disciplina d) throws SQLException {
		Connection con = null;
		PreparedStatement ps;
		try {
			con = ConexaoFactory.conectar();
			String sql = "insert into unidade_de_ensino_disciplina (UND_DIS_ID, UND_UDE_ID)"
					+ " values(?,?)";

			ps = con.prepareStatement(sql);
			ps.setInt(1, d.getDisId());
			ps.setInt(2, u.getUdeId());
			System.out.println(ps);
			ps.executeUpdate();

			System.out.println("inserido com sucesso!");
		} catch (Exception e) {
			con.rollback();
			System.out.println("Erro: " + e.getMessage());
		}
	}

	public static void excluir(UnidadedeEnsino u, Disciplina d)
			throws SQLException {
		Connection con = null;
		PreparedStatement ps;

		try {
			con = ConexaoFactory.conectar();
			String sql = "delete from unidade_de_ensino_disciplina where UND_UDE_ID=? and UND_DIS_ID=?";
			ps = con.prepareStatement(sql);
			ps.setInt(1, u.getUdeId());
			ps.setInt(2, d.getDisId());
			ps.executeUpdate();

		} catch (Exception e) {
			con.rollback();
			System.out.println("Erro: " + e.getMessage());
		}

	}

	public static boolean temOuNao(UnidadedeEnsino u, Disciplina d) throws SQLException {
		Connection con;
		PreparedStatement ps;
		Integer total = null;
		try {
			con = ConexaoFactory.conectar();

			String sql = "select count(dp.UND_ID) from unidade_de_ensino_disciplina dp where dp.UND_UDE_ID=? and dp.UND_DIS_ID=? ";
			ps = con.prepareStatement(sql);
			ps.setInt(1, u.getUdeId());
			ps.setInt(2, d.getDisId());
			System.out.println(ps);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				total = rs.getInt("count(dp.UND_ID)");
			}
			if (total > 0) {
				return true;
			}

		} catch (Exception e) {
			System.out.println("Falha ao listar disciplinas " + e.getMessage());
			e.printStackTrace();
		}

		return false;
	}

}
